package gramaticaPrecedencia;

import gramatica.ParteDerecha;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.Set;

import simbolo.NoTerminal;
import simbolo.Simbolo;
import simbolo.Terminal;

import com.thoughtworks.xstream.XStream;

public class GramaticaSerializable {
	private Tabla tabla;
	private Simbolo simboloInicial;
	private Map<NoTerminal, Set<ParteDerecha>> producciones;
	private ArrayList<Terminal> terminales;
	
	public GramaticaSerializable(Tabla tabla, Simbolo simboloInicial,Map<NoTerminal, Set<ParteDerecha>> producciones, ArrayList<Terminal> terminales){
		this.tabla = tabla;
		this.simboloInicial = simboloInicial;
		this. producciones= producciones;
		this.terminales = terminales;
	}
	
	public boolean serializar(String path) throws IOException{

		boolean escrituraExitosa= true;
		if(path==null){
    		//Valor por defecto
    		path = new String("GramaticaSerializable.xml");
    	}
        XStream xstream = new XStream();

        String tablaXml = xstream.toXML(this);

        BufferedWriter tablaArchivo=null;
        try {
            tablaArchivo = new BufferedWriter(new FileWriter(path));
            tablaArchivo.write(tablaXml);
            
        } catch (IOException e) {
        	escrituraExitosa = false;
        	System.out.println("Error al escribir el archivo en el path: "+ path);
        }finally{
        	tablaArchivo.close();
        }
        
        return escrituraExitosa;
	}

	public Map<NoTerminal, Set<ParteDerecha>> getProducciones() {
		return producciones;
	}

	public void setProducciones(Map<NoTerminal, Set<ParteDerecha>> producciones) {
		this.producciones = producciones;
	}

	public Simbolo getSimboloInicial() {
		return simboloInicial;
	}

	public void setSimboloInicial(Simbolo simboloInicial) {
		this.simboloInicial = simboloInicial;
	}

	public Tabla getTabla() {
		return tabla;
	}

	public void setTabla(Tabla tabla) {
		this.tabla = tabla;
	}

	public ArrayList<Terminal> getTerminales() {
		return terminales;
	}

	public void setTerminales(ArrayList<Terminal> terminales) {
		this.terminales = terminales;
	}
	
	
}
